﻿Public Class Buscaminas

    Private tablero(14, 14) As String
    Private NumeroDeMinas As Integer = 40
    Private PosicionDeMinas As New List(Of Integer)

    Public ReadOnly Property _NumeroDeMinas As Integer
        Get
            Return NumeroDeMinas
        End Get
    End Property

    Private Sub crearTablero()
        Dim x As Integer
        Dim y As Integer
        For i = 0 To 224
            If y > 14 Then
                y = 0
                x += 1
            End If
            tablero(x, y) = "-"
            y += 1
        Next
    End Sub

    Public Function generarMinas()
        crearTablero()
        PosicionDeMinas.Clear()
        Dim r As New Random
        Dim PosicionHorizontal As Integer
        Dim PosicionVertical As Integer
        For i = 0 To NumeroDeMinas - 1
            PosicionHorizontal = r.Next(1, 15)
            PosicionVertical = r.Next(1, 15)
            If tablero(PosicionHorizontal - 1, PosicionVertical - 1) = "-" Then
                tablero(PosicionHorizontal - 1, PosicionVertical - 1) = "9"
                PosicionMinas(PosicionVertical, PosicionHorizontal)
            Else
                i = i - 1
            End If
        Next
        ColocarNumeros()
        Return tablero
    End Function

    Private Sub ColocarNumeros()
        Dim x As Integer = 0
        Dim y As Integer = 0
        For i As Integer = 0 To 224
            If x > 14 Then
                x = 0
                y += 1
            End If
            If tablero(x, y) = "-" Then
                Dim NumeroMinasAlredecor As Integer = 0
                If i = 0 Then
                    NumeroMinasAlredecor = ControlDeMinas(1, x, y)
                ElseIf i > 0 And i < 14 Then
                    NumeroMinasAlredecor = ControlDeMinas(2, x, y)
                ElseIf i = 14 Then
                    NumeroMinasAlredecor = ControlDeMinas(3, x, y)
                ElseIf i Mod 15 = 0 And i <> 210 Then
                    NumeroMinasAlredecor = ControlDeMinas(4, x, y)
                ElseIf (i + 1) Mod 15 = 0 And i <> 224 Then
                    NumeroMinasAlredecor = ControlDeMinas(5, x, y)
                ElseIf i = 210 Then
                    NumeroMinasAlredecor = ControlDeMinas(6, x, y)
                ElseIf i >= 211 And i < 223 Then
                    NumeroMinasAlredecor = ControlDeMinas(7, x, y)
                ElseIf i = 224 Then
                    NumeroMinasAlredecor = ControlDeMinas(8, x, y)
                ElseIf i > 15 And i <= 208 Then
                    NumeroMinasAlredecor = ControlDeMinas(9, x, y)
                End If
                tablero(x, y) = NumeroMinasAlredecor

            End If
            x = x + 1
        Next
    End Sub

    Public ReadOnly Property PosicionamientoDeMinas As ObjectModel.ReadOnlyCollection(Of Integer)
        Get
            Return PosicionDeMinas.AsReadOnly
        End Get
    End Property


    Private Function ControlDeMinas(ByVal numBoton As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
        Dim minas As Integer = 0
        Select Case numBoton
            Case 1
                If tablero(x, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y) = "9" Then
                    minas += 1
                End If
            Case 2
                If tablero(x, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y + 1) = "9" Then
                    minas += 1
                End If
            Case 3
                If tablero(x, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y + 1) = "9" Then
                    minas += 1
                End If
            Case 4
                If tablero(x, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y + 1) = "9" Then
                    minas += 1
                End If
            Case 5
                If tablero(x, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y + 1) = "9" Then
                    minas += 1
                End If
            Case 6
                If tablero(x, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y) = "9" Then
                    minas += 1
                End If

            Case 7
                If tablero(x, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y - 1) = "9" Then
                    minas += 1
                End If
            Case 8
                If tablero(x - 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x, y - 1) = "9" Then
                    minas += 1
                End If
            Case 9
                If tablero(x + 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x + 1, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x, y + 1) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y - 1) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y) = "9" Then
                    minas += 1
                End If
                If tablero(x - 1, y + 1) = "9" Then
                    minas += 1
                End If
        End Select
        Return minas
    End Function

    Private Sub PosicionMinas(ByVal x As Integer, ByVal y As Integer)
        Dim asd As Integer = 0
        asd = ((x * 15) + y) - 16
        PosicionDeMinas.Add(asd)
    End Sub

    Public Function ComprobarAlrededor(ByVal NumeroBoton As Integer, ByVal ListaRecibida As List(Of Integer)) As List(Of Integer)
        Dim chuleta As New List(Of Integer)
        Dim ListaDevolver As New List(Of Integer)
        Dim NumerosYaComprobados As New List(Of Integer)
        Dim SeguirComprobando As New List(Of Integer)
        Dim PosicionTablero As New List(Of Integer)

        Dim MuroDerecha As New List(Of Integer)
        MuroDerecha.Add(14)
        MuroDerecha.Add((15 * 2) - 1)
        MuroDerecha.Add((15 * 3) - 1)
        MuroDerecha.Add((15 * 4) - 1)
        MuroDerecha.Add((15 * 5) - 1)
        MuroDerecha.Add((15 * 6) - 1)
        MuroDerecha.Add((15 * 7) - 1)
        MuroDerecha.Add((15 * 8) - 1)
        MuroDerecha.Add((15 * 9) - 1)
        MuroDerecha.Add((15 * 10) - 1)
        MuroDerecha.Add((15 * 11) - 1)
        MuroDerecha.Add((15 * 12) - 1)
        MuroDerecha.Add((15 * 13) - 1)
        MuroDerecha.Add((15 * 14) - 1)
        MuroDerecha.Add((15 * 15) - 1)


        Dim MuroIzquierda As New List(Of Integer)
        MuroIzquierda.Add(0)
        MuroIzquierda.Add(15)
        MuroIzquierda.Add(15 * 2)
        MuroIzquierda.Add(15 * 3)
        MuroIzquierda.Add(15 * 4)
        MuroIzquierda.Add(15 * 5)
        MuroIzquierda.Add(15 * 6)
        MuroIzquierda.Add(15 * 7)
        MuroIzquierda.Add(15 * 8)
        MuroIzquierda.Add(15 * 9)
        MuroIzquierda.Add(15 * 10)
        MuroIzquierda.Add(15 * 11)
        MuroIzquierda.Add(15 * 12)
        MuroIzquierda.Add(15 * 13)
        MuroIzquierda.Add(15 * 14)
        MuroIzquierda.Add(15 * 15)


        chuleta = ListaRecibida
        SeguirComprobando.Add(NumeroBoton)
        ListaDevolver.Add(NumeroBoton)
        NumerosYaComprobados.Add(NumeroBoton)
        Dim prueba As Integer
        Do
            prueba = SeguirComprobando(0)
            If chuleta(prueba) = 0 Then
                If MuroDerecha.Contains(prueba) Then
                    If prueba - 16 >= 0 Then ListaDevolver.Add(prueba - 16)
                    If prueba - 15 >= 0 Then ListaDevolver.Add(prueba - 15)
                    If prueba - 1 >= 0 Then ListaDevolver.Add(prueba - 1)
                    If prueba + 14 <= 225 Then ListaDevolver.Add(prueba + 14)
                    If prueba + 15 <= 225 Then ListaDevolver.Add(prueba + 15)
                ElseIf MuroIzquierda.Contains(prueba) Then
                    If prueba - 15 >= 0 Then ListaDevolver.Add(prueba - 15)
                    If prueba - 14 >= 0 Then ListaDevolver.Add(prueba - 14)
                    If prueba + 1 <= 225 Then ListaDevolver.Add(prueba + 1)
                    If prueba + 15 <= 225 Then ListaDevolver.Add(prueba + 15)
                    If prueba + 16 <= 225 Then ListaDevolver.Add(prueba + 16)
                Else
                    If prueba - 16 >= 0 Then ListaDevolver.Add(prueba - 16)
                    If prueba - 15 >= 0 Then ListaDevolver.Add(prueba - 15)
                    If prueba - 14 >= 0 Then ListaDevolver.Add(prueba - 14)
                    If prueba - 1 >= 0 Then ListaDevolver.Add(prueba - 1)
                    If prueba + 1 <= 225 Then ListaDevolver.Add(prueba + 1)
                    If prueba + 14 <= 225 Then ListaDevolver.Add(prueba + 14)
                    If prueba + 15 <= 225 Then ListaDevolver.Add(prueba + 15)
                    If prueba + 16 <= 225 Then ListaDevolver.Add(prueba + 16)
                End If
            End If

            If MuroDerecha.Contains(prueba) Then
                If prueba - 16 > 0 AndAlso prueba - 16 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 16) Then
                            SeguirComprobando.Add(prueba - 16)
                            NumerosYaComprobados.Add(prueba - 16)
                        End If
                    End If
                End If
                If prueba - 15 > 0 AndAlso prueba - 15 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 15) Then
                            SeguirComprobando.Add(prueba - 15)
                            NumerosYaComprobados.Add(prueba - 15)
                        End If
                    End If
                End If
                If prueba - 1 > 0 AndAlso prueba - 1 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 1) Then
                            SeguirComprobando.Add(prueba - 1)
                            NumerosYaComprobados.Add(prueba - 1)
                        End If
                    End If
                End If
                If prueba + 14 > 0 AndAlso prueba + 14 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 14) Then
                            SeguirComprobando.Add(prueba + 14)
                            NumerosYaComprobados.Add(prueba + 14)
                        End If
                    End If
                End If
                If prueba + 15 > 0 AndAlso prueba + 15 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 15) Then
                            SeguirComprobando.Add(prueba + 15)
                            NumerosYaComprobados.Add(prueba + 15)
                        End If
                    End If
                End If

            ElseIf MuroIzquierda.Contains(prueba) Then


                If prueba - 14 > 0 AndAlso prueba - 14 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 14) Then
                            SeguirComprobando.Add(prueba - 14)
                            NumerosYaComprobados.Add(prueba - 14)
                        End If
                    End If
                End If
                If prueba - 15 > 0 AndAlso prueba - 15 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 15) Then
                            SeguirComprobando.Add(prueba - 15)
                            NumerosYaComprobados.Add(prueba - 15)
                        End If
                    End If
                End If
                If prueba + 1 > 0 AndAlso prueba + 1 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 1) Then
                            SeguirComprobando.Add(prueba + 1)
                            NumerosYaComprobados.Add(prueba + 1)
                        End If
                    End If
                End If
                If prueba + 16 > 0 AndAlso prueba + 16 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 16) Then
                            SeguirComprobando.Add(prueba + 16)
                            NumerosYaComprobados.Add(prueba + 16)
                        End If
                    End If
                End If
                If prueba + 15 > 0 AndAlso prueba + 15 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 15) Then
                            SeguirComprobando.Add(prueba + 15)
                            NumerosYaComprobados.Add(prueba + 15)
                        End If
                    End If
                End If
            Else
                If prueba + 1 > 0 AndAlso prueba + 1 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 1) Then
                            SeguirComprobando.Add(prueba + 1)
                            NumerosYaComprobados.Add(prueba + 1)
                        End If
                    End If
                End If
                If prueba + 16 > 0 AndAlso prueba + 16 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 16) Then
                            SeguirComprobando.Add(prueba + 16)
                            NumerosYaComprobados.Add(prueba + 16)
                        End If
                    End If
                End If
                If prueba + 15 > 0 AndAlso prueba + 15 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 15) Then
                            SeguirComprobando.Add(prueba + 15)
                            NumerosYaComprobados.Add(prueba + 15)
                        End If
                    End If
                End If
                If prueba + 14 > 0 AndAlso prueba + 14 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba + 14) Then
                            SeguirComprobando.Add(prueba + 14)
                            NumerosYaComprobados.Add(prueba + 14)
                        End If
                    End If
                End If
                If prueba - 14 > 0 AndAlso prueba - 14 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 14) Then
                            SeguirComprobando.Add(prueba - 14)
                            NumerosYaComprobados.Add(prueba - 14)
                        End If
                    End If
                End If
                If prueba - 15 > 0 AndAlso prueba - 15 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 15) Then
                            SeguirComprobando.Add(prueba - 15)
                            NumerosYaComprobados.Add(prueba - 15)
                        End If
                    End If
                End If
                If prueba - 16 > 0 AndAlso prueba - 16 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 16) Then
                            SeguirComprobando.Add(prueba - 16)
                            NumerosYaComprobados.Add(prueba - 16)
                        End If
                    End If
                End If
                If prueba - 1 > 0 AndAlso prueba - 1 < 255 Then
                    If chuleta(prueba) >= 0 AndAlso chuleta(prueba) <= 225 Then
                        If chuleta(prueba) = 0 AndAlso Not NumerosYaComprobados.Contains(prueba - 1) Then
                            SeguirComprobando.Add(prueba - 1)
                            NumerosYaComprobados.Add(prueba - 1)
                        End If
                    End If
                End If
            End If
            For i = SeguirComprobando.Count - 1 To 0 Step -1
                If SeguirComprobando(i) > 224 Then
                    SeguirComprobando.RemoveAt(i)
                End If
            Next
            SeguirComprobando.RemoveAt(0)
        Loop While SeguirComprobando.Count > 0
        ListaDevolver.Sort()
        Dim ListaFinal As New List(Of Integer)
        For i = 0 To 224
            If ListaDevolver.Contains(i) Then ListaFinal.Add(i)
        Next
        Return ListaFinal
        'si tienes alguna duda preguntar a lacasta. Él sabrá...
    End Function
End Class